package br.unicamp.ic.sgct.client.aplicacao.usuario;

import br.unicamp.ic.sgct.client.aplicacao.comum.BaseListener;
import br.unicamp.ic.sgct.client.dominio.exception.InfraException;
import br.unicamp.ic.sgct.client.dominio.to.ConferenciaTO;
import br.unicamp.ic.sgct.client.dominio.to.ParticipanteTO;
import br.unicamp.ic.sgct.client.dominio.to.UsuarioTO;
import java.util.List;

public interface UsuarioListener extends BaseListener {

    public interface HandlerInscrever {

        public void handleSucesso(UsuarioTO usuario);

        public void handleErro(Throwable caught);
    }

    /**
     * Faz registro no site criando usuario com login valendo e-mail fornecido e
     * que deve ser unico dentre usuarios cadastrados.
     */
    public abstract void inscrever(UsuarioTO usuario, Long idConferencia, HandlerInscrever handler);

    public interface HandlerTemPerfil {

        public void handleSucesso(boolean result);

        public void handleErro(Throwable caught);
    }

    public abstract void temPerfil(String perfil, HandlerTemPerfil handler);

    public interface HandlerObterUsername {

        public void handleSucesso(String result);

        public void handleErro(Throwable caught);
    }

    public abstract void obterUsername(HandlerObterUsername handler);

    /**
     *
     * @return List<ConferenciaTO>
     *
     * @throws InfraException
     * @throws Exception
     */
    public interface HandlerObterUsuario {

        public void handleSucesso(UsuarioTO result);

        public void handleErro(Throwable caught);
    }

    public abstract void obterUsuario(HandlerObterUsuario handler);

    public interface HandlerObterParticipanteConferencia {

        public void handleSucesso(ParticipanteTO result, ConferenciaTO to);

        public void handleErro(Throwable caught);
    }

    public void obterParticipanteConferencia(ConferenciaTO to, HandlerObterParticipanteConferencia handler);

    public interface HandlerObterParticipacoesConferencia {

        public void handleSucesso(List<UsuarioTO> result);

        public void handleErro(Throwable caught);
    }

    public void obterParticipacoesConferencia(final ConferenciaTO to, HandlerObterParticipacoesConferencia handler);

    public interface HandlerObterParticipantesConferencia {

        public void handleSucesso(List<ParticipanteTO> result);

        public void handleErro(Throwable caught);
    }

    public void obterParticipantesConferencia(Long idConferencia, HandlerObterParticipantesConferencia handler);

    public interface HandlerCancelar {

        public void handleSucesso(Boolean result);

        public void handleErro(Throwable caught);
    }

    public abstract void cancelar(UsuarioTO usuario, HandlerCancelar handler);
}
